package com.xia.demo.lock;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * SemaphoreTest测试用例
 *
 * 业务场景 ：
 *
 * 1、停车场容纳总停车量10。
 *
 * 2、当一辆车进入停车场后，显示牌的剩余车位数响应的减1.
 *
 * 3、每有一辆车驶出停车场后，显示牌的剩余车位数响应的加1。
 *
 * 4、停车场剩余车位不足时，车辆只能在外面等待。
 *
 * @author : xia
 * @date: 2023-05-03 13:58
 */
public class SemaphoreTest1 {
    //停车场同时容纳的车辆5
    private  static Semaphore semaphore=new Semaphore(5);
    public static void main(String[] args) {
        //模拟20辆车进入停车场
        for(int i=0;i<20;i++){
            Thread thread=new Thread(new Runnable() {
                public void run() {
                    try {
                        System.out.println("===="+Thread.currentThread().getName()+"来到停车场");
                        if(semaphore.availablePermits()==0){
                            System.out.println("车位不足，请耐心等待");
                        }
                        semaphore.acquire();//获取令牌尝试进入停车场
                        System.out.println(Thread.currentThread().getName()+"成功进入停车场");
                        Thread.sleep(new Random().nextInt(10000));//模拟车辆在停车场停留的时间
                        System.out.println(Thread.currentThread().getName()+"驶出停车场");
                        semaphore.release();//释放令牌，腾出停车场车位
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            },i+"号车");
            thread.start();
        }
    }
}
